package org.jmc.refmanager.domain.service;

import java.util.List;

import org.jmc.refmanager.domain.dao.QueryParam;
import org.jmc.refmanager.domain.model.Change;
import org.jmc.refmanager.domain.model.OrgUnit;
import org.jmc.refmanager.domain.model.User;

public interface ChangeManager {
	/**
	 * Persist a Task entity in the database
	 * 
	 * @param transientTask
	 */
	public void persist(Change transientTask);

	/**
	 * Remove a persisted Task from the database
	 * 
	 * @param persistentTask
	 */
	public void remove(Change persistentTask);

	/**
	 * Remove a Task from the database by id
	 * 
	 * @param task id
	 */
	public void remove(Integer taskId);
	
	/**
	 * Update a Task in the database
	 * 
	 * @param detachedTask
	 * @return merged Task
	 */
	public Change update(Change detachedTask);

	/**
	 * Find a Task by id
	 * 
	 * @param id
	 * @return the found Task
	 */
	public Change findById(Integer taskId);

	/**
	 * Find all Task
	 * 
	 * @return the found Task
	 */
	public List<Change> findAll();

	/**
	 * Assignation d'un changement de type creation d'un nouveau service
	 * 
	 * @param newService Nouveau service
	 * @param user Operateur ayant fait la modification
	 */
	public void assignNewService(OrgUnit newService, User user);

	/**
	 * Assignation d'un changement de type mise e jour d'un service
	 * 
	 * @param service Service mis e jour
	 * @param user Operateur ayant fait la modification
	 */
	public void assignUpdateService(OrgUnit service, User user);

	/**
	 * Assignation d'un changement de type mise e jour d'un service
	 * 
	 * @param service Service mis e jour
	 * @param user Operateur ayant fait la modification
	 */
	public void assignMoveService(OrgUnit service, User user);

	/**
	 * Assignation d'un changement de type suppression d'un service
	 * 
	 * @param service Service e supprimer
	 * @param user Operateur ayant fait la modification
	 */
	public void assignDeleteService(OrgUnit service, User user);

	// ===================================================================
	// Gestion du cycle de vie des changements
	// TODO Voir s'il est possible de se passer du user dans la signature
	// en utilisant le contexte de securite Spring
	// ===================================================================
	/**
	 * Reserve le changement pour une validation et rend indisponible
	 * le changement pour les autres approbateurs.
	 * 
	 * @param change
	 */
	public void checkout(Change change, User approver);
	
	/**
	 * Approuve le changement.
	 * 
	 * @param change
	 */
	public void commitAndApprove(Change change, OrgUnit updatedServiceByApprover, boolean useApproverUpdates, User approver);

	/**
	 * Refuse le changement.
	 * 
	 * @param change
	 */
	public void commitAndReject(Change change, User approver);

	/**
	 * Annule les modifications et rend disponible le changement
	 * e d'autres approbateurs
	 * 
	 * @param change
	 */
	public void revert(Change change, User approver);
	
	
	public List<Change> findMyTasks(QueryParam<Change> queryParameters);
	public Integer countMyTasks(QueryParam<Change> queryParameters);

	public List<Change> findMyGroupTasks(QueryParam<Change> queryParameters);
	public Integer countMyGroupTasks(QueryParam<Change> queryParameters);
}
